sources <- c("ESPN", "FantasyData", "FantasyPros", "FantasySharks", 
             "Yahoo", "FantasyFootballNerd", "NumberFire",
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 290.998 sec elapsed

Results

sim_lu %>%
  filter(lineup<=3) %>%
  arrange(lineup, position, desc(pts_pred)) %>%
  knitr::kable() %>%
  kable_styling() %>%
  column_spec(1, bold=TRUE) %>%
  collapse_rows(columns = 1, valign = 'top')
lineup Name team position pts_base pts_pred sd_pts Salary
1 Kyler Murray ARI QB 23.05440 23.737451 1.7731896 8400
Alvin Kamara NOS RB 21.15700 21.316253 1.5270780 9300
Kareem Hunt CLE RB 17.59534 17.465966 0.7148842 7100
Clyde Edwards-Helaire KCC RB 14.29325 16.611044 1.2142494 7000
Terry McLaurin WAS WR 13.50789 14.638063 0.6449310 7100
Keenan Allen LAC WR 12.90975 14.142125 1.6012907 7000
Cole Beasley BUF WR 9.32200 12.012274 1.8962454 5100
Dalton Schultz DAL TE 6.09525 9.676482 1.7776374 5200
Dallas Cowboys DAL DST 6.62750 6.897344 0.2965200 3700
2 Russell Wilson SEA QB 23.84285 23.100447 1.0127641 8700
Alvin Kamara NOS RB 21.15700 23.122467 1.5270780 9300
Kareem Hunt CLE RB 17.59534 17.594401 0.7148842 7100
Chris Carson SEA RB 15.91617 16.551159 0.6881592 7600
Robby Anderson CAR WR 12.70050 13.668457 0.7773628 6400
Tyler Boyd CIN WR 12.41075 13.398276 1.0229940 6000
Breshad Perriman NYJ WR 7.81800 11.080377 2.8169400 4800
George Kittle SFO TE 12.56225 12.334659 0.4151280 7100
New York Jets NYJ DST 5.23000 5.230000 0.0000000 3000
3 Teddy Bridgewater CAR QB 17.19075 20.063779 1.2348575 6800
Aaron Jones GBP RB 18.19652 21.979820 2.5442486 8500
Derrick Henry TEN RB 18.12500 21.095655 1.3781752 8900
Kareem Hunt CLE RB 17.59534 18.669513 0.7148842 7100
Tyler Boyd CIN WR 12.41075 14.186526 1.0229940 6000
Keenan Allen LAC WR 12.90975 14.031868 1.6012907 7000
Deebo Samuel SFO WR 11.49250 11.826569 0.3113460 5400
George Kittle SFO TE 12.56225 12.521144 0.4151280 7100
Carolina Panthers CAR DST 3.95500 5.451293 0.8302560 3200
ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
sim_lu %>%
  group_by(lineup) %>%
  mutate(lineup_pts=sum(pts_pred)) %>%
  group_by(lineup, position) %>%
  mutate(n = n()) %>%
  select(lineup, position, n, lineup_pts) %>%
  distinct() %>%
  spread(key=position, value=n) %>%
  filter(RB >= 2, TE >= 1, WR >= 3) %>%
  mutate(flex = case_when(RB==3 ~ 'RB',
                          TE==2 ~ 'TE',
                          WR==4 ~ 'WR')) %>%
  group_by(flex) %>%
  dplyr::summarize(median_pts = round(median(lineup_pts), 3),
                   cases = n()) %>%
  knitr::kable() %>%
  kable_styling(full_width = FALSE)
flex median_pts cases
RB 137.129 9999
WR 135.701 1
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd)) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs Uncertainty',
          subtitle = 'Pareto Lineups Bolded')

psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
915 132.21 4.85 Russell Wilson SEA QB 24.40 1.01 8700
Chris Carson SEA RB 16.93 0.69 7600
Kareem Hunt CLE RB 17.91 0.71 7100
James Robinson JAC RB 14.45 0.31 6400
Stefon Diggs BUF WR 14.90 0.56 7500
Robby Anderson CAR WR 12.90 0.78 6400
Deebo Samuel SFO WR 11.71 0.31 5400
Travis Kelce KCC TE 13.78 0.47 7900
New York Jets NYJ DST 5.23 0.00 3000
8177 135.84 5.04 Russell Wilson SEA QB 24.51 1.01 8700
Alvin Kamara NOS RB 24.58 1.53 9300
Kareem Hunt CLE RB 16.59 0.71 7100
James Robinson JAC RB 14.26 0.31 6400
DK Metcalf SEA WR 14.22 0.14 7300
Tee Higgins CIN WR 12.13 0.61 5700
Deebo Samuel SFO WR 11.65 0.31 5400
George Kittle SFO TE 12.65 0.42 7100
New York Jets NYJ DST 5.23 0.00 3000
5562 136.16 5.79 Deshaun Watson HOU QB 23.65 0.85 8000
Alvin Kamara NOS RB 21.66 1.53 9300
Kareem Hunt CLE RB 17.76 0.71 7100
Clyde Edwards-Helaire KCC RB 17.12 1.21 7000
DK Metcalf SEA WR 14.03 0.14 7300
Tee Higgins CIN WR 12.65 0.61 5700
Deebo Samuel SFO WR 10.96 0.31 5400
George Kittle SFO TE 13.10 0.42 7100
New York Jets NYJ DST 5.23 0.00 3000
412 137.27 6.00 Deshaun Watson HOU QB 23.07 0.85 8000
Alvin Kamara NOS RB 22.88 1.53 9300
Kareem Hunt CLE RB 18.30 0.71 7100
Antonio Gibson WAS RB 14.03 0.97 5700
DK Metcalf SEA WR 14.03 0.14 7300
Robby Anderson CAR WR 13.56 0.78 6400
Deebo Samuel SFO WR 11.65 0.31 5400
George Kittle SFO TE 13.25 0.42 7100
Dallas Cowboys DAL DST 6.50 0.30 3700
9756 137.88 6.14 Russell Wilson SEA QB 24.43 1.01 8700
Alvin Kamara NOS RB 21.72 1.53 9300
Kareem Hunt CLE RB 19.32 0.71 7100
James Robinson JAC RB 14.31 0.31 6400
Terry McLaurin WAS WR 14.56 0.64 7100
Deebo Samuel SFO WR 12.07 0.31 5400
Tre’Quan Smith NOS WR 10.58 0.34 5300
George Kittle SFO TE 12.88 0.42 7100
Cincinnati Bengals CIN DST 8.00 0.86 3600
3730 138.23 6.23 Russell Wilson SEA QB 25.56 1.01 8700
Alvin Kamara NOS RB 21.99 1.53 9300
Kareem Hunt CLE RB 18.44 0.71 7100
James Robinson JAC RB 14.17 0.31 6400
Terry McLaurin WAS WR 14.17 0.64 7100
Robby Anderson CAR WR 13.70 0.78 6400
Deebo Samuel SFO WR 12.21 0.31 5400
Hunter Henry LAC TE 11.40 0.64 5800
Dallas Cowboys DAL DST 6.61 0.30 3700
9740 138.89 6.29 Russell Wilson SEA QB 25.70 1.01 8700
Alvin Kamara NOS RB 20.78 1.53 9300
Kareem Hunt CLE RB 18.37 0.71 7100
David Johnson HOU RB 14.34 0.64 6300
Terry McLaurin WAS WR 14.45 0.64 7100
Tyler Boyd CIN WR 15.46 1.02 6000
Deebo Samuel SFO WR 11.13 0.31 5400
George Kittle SFO TE 13.43 0.42 7100
New York Jets NYJ DST 5.23 0.00 3000
8823 139.23 6.51 Deshaun Watson HOU QB 22.31 0.85 8000
Alvin Kamara NOS RB 24.38 1.53 9300
Kareem Hunt CLE RB 18.39 0.71 7100
Antonio Gibson WAS RB 14.38 0.97 5700
Terry McLaurin WAS WR 14.62 0.64 7100
Robby Anderson CAR WR 13.19 0.78 6400
Deebo Samuel SFO WR 11.89 0.31 5400
George Kittle SFO TE 12.77 0.42 7100
Dallas Cowboys DAL DST 7.31 0.30 3700
8487 140.07 6.56 Russell Wilson SEA QB 26.41 1.01 8700
Alvin Kamara NOS RB 23.64 1.53 9300
Kareem Hunt CLE RB 18.06 0.71 7100
Antonio Gibson WAS RB 14.21 0.97 5700
Stefon Diggs BUF WR 15.17 0.56 7500
Christian Kirk ARI WR 11.94 0.99 5400
Deebo Samuel SFO WR 11.60 0.31 5400
Travis Kelce KCC TE 13.79 0.47 7900
New York Jets NYJ DST 5.23 0.00 3000
3804 142.50 6.61 Russell Wilson SEA QB 24.25 1.01 8700
Alvin Kamara NOS RB 26.19 1.53 9300
Kareem Hunt CLE RB 17.80 0.71 7100
Giovani Bernard CIN RB 12.63 0.99 4800
Stefon Diggs BUF WR 15.02 0.56 7500
Robby Anderson CAR WR 14.69 0.78 6400
Deebo Samuel SFO WR 11.96 0.31 5400
George Kittle SFO TE 12.73 0.42 7100
Dallas Cowboys DAL DST 7.22 0.30 3700
9103 143.28 7.12 Russell Wilson SEA QB 25.95 1.01 8700
Alvin Kamara NOS RB 25.01 1.53 9300
Kareem Hunt CLE RB 18.51 0.71 7100
Giovani Bernard CIN RB 12.70 0.99 4800
Robby Anderson CAR WR 13.69 0.78 6400
Tyler Boyd CIN WR 13.90 1.02 6000
Deebo Samuel SFO WR 12.05 0.31 5400
Travis Kelce KCC TE 14.44 0.47 7900
Dallas Cowboys DAL DST 7.04 0.30 3700
3809 143.55 7.70 Kyler Murray ARI QB 25.46 1.77 8400
Alvin Kamara NOS RB 23.90 1.53 9300
Kareem Hunt CLE RB 18.47 0.71 7100
Antonio Gibson WAS RB 15.33 0.97 5700
Tyler Lockett SEA WR 16.62 0.83 7400
Terry McLaurin WAS WR 14.61 0.64 7100
Deebo Samuel SFO WR 11.79 0.31 5400
Hunter Henry LAC TE 10.56 0.64 5800
Dallas Cowboys DAL DST 6.83 0.30 3700
4059 143.56 8.37 Kyler Murray ARI QB 24.85 1.77 8400
Alvin Kamara NOS RB 22.60 1.53 9300
Kareem Hunt CLE RB 18.62 0.71 7100
Antonio Gibson WAS RB 15.80 0.97 5700
Davante Adams GBP WR 18.76 1.11 8900
Tyler Boyd CIN WR 14.47 1.02 6000
Tee Higgins CIN WR 12.59 0.61 5700
Hunter Henry LAC TE 10.64 0.64 5800
New York Jets NYJ DST 5.23 0.00 3000
9097 143.61 8.52 Deshaun Watson HOU QB 24.08 0.85 8000
Alvin Kamara NOS RB 27.24 1.53 9300
Aaron Jones GBP RB 21.76 2.54 8500
Kareem Hunt CLE RB 16.91 0.71 7100
Robby Anderson CAR WR 12.63 0.78 6400
Tyler Boyd CIN WR 13.95 1.02 6000
Deebo Samuel SFO WR 11.22 0.31 5400
Hunter Henry LAC TE 9.91 0.64 5800
Atlanta Falcons ATL DST 5.90 0.13 3500
485 144.06 8.72 Kyler Murray ARI QB 24.68 1.77 8400
Alvin Kamara NOS RB 24.64 1.53 9300
Kareem Hunt CLE RB 17.96 0.71 7100
Antonio Gibson WAS RB 14.19 0.97 5700
Davante Adams GBP WR 18.14 1.11 8900
Deebo Samuel SFO WR 11.92 0.31 5400
Cole Beasley BUF WR 14.64 1.90 5100
George Kittle SFO TE 12.65 0.42 7100
New York Jets NYJ DST 5.23 0.00 3000
3143 145.10 8.83 Deshaun Watson HOU QB 23.87 0.85 8000
Alvin Kamara NOS RB 26.33 1.53 9300
Kareem Hunt CLE RB 18.79 0.71 7100
Giovani Bernard CIN RB 13.20 0.99 4800
Davante Adams GBP WR 17.11 1.11 8900
Tyler Boyd CIN WR 12.23 1.02 6000
Cole Beasley BUF WR 14.25 1.90 5100
George Kittle SFO TE 12.22 0.42 7100
Dallas Cowboys DAL DST 7.11 0.30 3700
5451 145.78 9.29 Russell Wilson SEA QB 27.00 1.01 8700
Alvin Kamara NOS RB 23.77 1.53 9300
Aaron Jones GBP RB 25.67 2.54 8500
Kareem Hunt CLE RB 17.05 0.71 7100
Terry McLaurin WAS WR 14.51 0.64 7100
Deebo Samuel SFO WR 11.50 0.31 5400
Cole Beasley BUF WR 10.75 1.90 5100
Hunter Henry LAC TE 10.30 0.64 5800
New York Jets NYJ DST 5.23 0.00 3000
2834 146.68 9.36 Josh Allen BUF QB 25.15 2.23 8800
Alvin Kamara NOS RB 23.31 1.53 9300
Aaron Jones GBP RB 26.29 2.54 8500
Kareem Hunt CLE RB 17.97 0.71 7100
Robby Anderson CAR WR 13.85 0.78 6400
Tee Higgins CIN WR 12.98 0.61 5700
Deebo Samuel SFO WR 11.75 0.31 5400
Hunter Henry LAC TE 10.16 0.64 5800
New York Jets NYJ DST 5.23 0.00 3000
7019 147.33 9.43 Josh Allen BUF QB 26.83 2.23 8800
Alvin Kamara NOS RB 24.79 1.53 9300
Aaron Jones GBP RB 26.75 2.54 8500
Kareem Hunt CLE RB 18.03 0.71 7100
Robby Anderson CAR WR 12.59 0.78 6400
Tee Higgins CIN WR 11.40 0.61 5700
Deebo Samuel SFO WR 12.01 0.31 5400
Eric Ebron PIT TE 7.99 0.42 5100
Dallas Cowboys DAL DST 6.95 0.30 3700
4441 149.52 10.38 Cam Newton NEP QB 22.64 2.02 7600
Alvin Kamara NOS RB 23.67 1.53 9300
Aaron Jones GBP RB 27.41 2.54 8500
Kareem Hunt CLE RB 18.18 0.71 7100
Keenan Allen LAC WR 15.69 1.60 7000
Tyler Boyd CIN WR 13.47 1.02 6000
Deebo Samuel SFO WR 12.35 0.31 5400
Hunter Henry LAC TE 10.89 0.64 5800
New York Jets NYJ DST 5.23 0.00 3000